package com.wgf.config;

import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.ChatMessageDeserializer;
import dev.langchain4j.data.message.ChatMessageSerializer;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;

@Component//RedisChatMemoryStore聊天记忆存储实现
public class RedisChatMemoryStore implements ChatMemoryStore {//实现 ChatMemoryStore 接口，重写三个方法，这是 LangChain4j 提供的聊天记忆存储标准接口

    public static final String CHAT_MEMORY_PREFIX = "CHAT_MEMORY:";//定义 Redis key 的前缀，用于区分不同类型的存储数据

    @Resource
    private RedisTemplate<String,String> redisTemplate;//注入配置好的 RedisTemplate，用于操作 Redis


    @Override
    public List<ChatMessage> getMessages(Object memoryId) {
        //opsForValue().get(): 从 Redis 字符串类型中获取值
        String retValue = redisTemplate.opsForValue().get(CHAT_MEMORY_PREFIX + memoryId);//获取消息: 根据 memoryId 从 Redis 中获取存储的聊天消息

        return  ChatMessageDeserializer.messagesFromJson(retValue);//将 JSON 字符串反序列化为 ChatMessage 列表
    }

    @Override
    public void updateMessages(Object memoryId, List<ChatMessage> messages) {//更新消息: 将聊天消息列表保存到 Redis
        //ChatMessageSerializer.messagesToJson(): 将 ChatMessage 列表序列化为 JSON 字符串
        //opsForValue().set(): 保存到 Redis 字符串类型中
        redisTemplate.opsForValue().set(CHAT_MEMORY_PREFIX + memoryId, ChatMessageSerializer.messagesToJson(messages));
    }

    @Override
    public void deleteMessages(Object memoryId) {
        //删除消息: 根据 memoryId 删除对应的聊天记忆
        redisTemplate.delete(CHAT_MEMORY_PREFIX + memoryId);
    }
}